#ifndef __WD_FUNC_H
#define __WD_FUNC_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <errno.h>
#include <error.h>
#include <sys/mman.h>
#include <sys/wait.h>
#include <time.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <signal.h>
#include <dirent.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/epoll.h>
#include <assert.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <pthread.h>
#include <sys/uio.h>

#define SIZE(a) (sizeof(a)/sizeof(a[0]))

typedef void (*sighandler_t)(int);

#define ARGS_CHECK(argc, num)   {\
    if(argc != num){\
        fprintf(stderr, "ARGS ERROR!\n");\
        return -1;\
    }}

#define ERROR_CHECK(ret, num, msg) {\
    if(ret == num) {\
        perror(msg);\
        return -1;\
    }}

#define THREAD_ERROR_CHECK(ret, func) {\
    if(ret != 0) {\
        fprintf(stderr, "%s:%s\n", func, strerror(ret));\
        return -1;\
    }}

typedef struct {
    int len;
    char buf[1000];
}train_t;


int tcpInit(const char * ip, unsigned short port);
int epollAddReadEvent(int epfd, int fd);//只关注读事件
int epollDelReadEvent(int epfd, int fd);//不再关注读写事件
int epollAddWriteEvent(int epfd, int fd);//同时关注读写事件
int epollClearWriteEvent(int epfd, int fd);//清除写事件，保留读事件
                                           
void handleReadEvent(int sockfd, int epfd);//处理读事件
void handleWriteEvent(int sockfd, int epfd);//处理写事件

int transferFile(int peerfd);

#endif

